package com.dynamicAgent;

import java.lang.reflect.Method;

/**
 * Project: tobe-better-coder
 * Package: com.dynamicAgent
 * 手写一个jdk实现动态代理的demo
 *
 * @author : Mr.xu
 * @date : 2021/10/30 2:19
 */
interface DemoProxy {
    public void method(String name);
}

interface InvokeHandel {
    void invoke(Object object, Method method, Object... args);
}

public class DynamicProxyDemo {
    public static void main(String[] args) {
        DemoProxy demoProxy = DynamicProxyDemo.createProxy(new InvokeHandel() {
            @Override
            public void invoke(Object object, Method method, Object... args) {
                System.out.println("被代理的方法=" + method.getName());
                System.out.println(method.getParameters().toString());
            }

            ;
        }, DemoProxy.class);
        demoProxy.method("张三");

    }

    /**
     * 这一部分是jdk帮我们做了已经
     *
     * @param invokeHandel
     * @param clazz
     * @return
     */
    public static DemoProxy createProxy(InvokeHandel invokeHandel, Class<?> clazz) {
        return new DemoProxy() {
            @Override
            public void method(String name) {
                try {
                    /**
                     * 这里是jvm处理，找到方法名，这个方法就是动态代理的时候jvm帮我们做的事情
                     */
                    Method method = clazz.getMethod("method", String.class);
                    invokeHandel.invoke(this, method, "张三");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
    }
}